package com.java.al.swing;

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.util.*;
import javax.swing.*;

public class PrintTest {
	public static void main(String[] args) {
		JFrame frame = new PrintTestFrame();
		frame.show();
	}
}

class PrintTestFrame extends JFrame implements ActionListener {
	public PrintTestFrame() {
		setTitle("PrintTest");
		setSize(300, 300);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		Container contentPane = getContentPane();
		canvas = new PrintPanel();
		contentPane.add(canvas, "Center");

		JPanel buttonPanel = new JPanel();
		printButton = new JButton("Print");
		buttonPanel.add(printButton);
		printButton.addActionListener(this);

		pageSetupButton = new JButton("Page   setup");
		buttonPanel.add(pageSetupButton);
		pageSetupButton.addActionListener(this);

		contentPane.add(buttonPanel, "North");
	}

	public void actionPerformed(ActionEvent event) {
		Object source = event.getSource();
		if (source == printButton) {
			PrinterJob printJob = PrinterJob.getPrinterJob();
			if (pageFormat == null)
				pageFormat = printJob.defaultPage();
			printJob.setPrintable(canvas, pageFormat);
			if (printJob.printDialog()) {
				try {
					printJob.print();
				} catch (PrinterException exception) {
					JOptionPane.showMessageDialog(this, exception);
				}
			}
		} else if (source == pageSetupButton) {
			PrinterJob printJob = PrinterJob.getPrinterJob();
			if (pageFormat == null)
				pageFormat = printJob.defaultPage();
			pageFormat = printJob.pageDialog(pageFormat);
		}
	}

	private JButton printButton;
	private JButton pageSetupButton;

	private PrintPanel canvas;
	private PageFormat pageFormat;
}

class PrintPanel extends JPanel implements Printable {
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		drawPage(g2);
	}

	public int print(Graphics g, PageFormat pf, int page)
			throws PrinterException {
		if (page >= 1)
			return Printable.NO_SUCH_PAGE;
		Graphics2D g2 = (Graphics2D) g;
		g2.setPaint(Color.black);
		g2.translate(pf.getImageableX(), pf.getImageableY());
		g2.draw(new Rectangle2D.Double(0, 0, pf.getImageableWidth(), pf
				.getImageableHeight()));

		drawPage(g2);
		return Printable.PAGE_EXISTS;
	}

	public void drawPage(Graphics2D g2) {
		// 请注意这里，在这里假设我可以使用一个生成的Graphics2D g_2d对象给g2赋值，
		// 下面该如何写？能正常打印
//		g2 = g_2d;// g_2d为已经生成的2d图形对象
		FontRenderContext context = g2.getFontRenderContext();
		Font f = new Font("Serif", Font.PLAIN, 72);
		GeneralPath clipShape = new GeneralPath();

		TextLayout layout = new TextLayout("Hello", f, context);
		AffineTransform transform = AffineTransform.getTranslateInstance(0, 72);
		Shape outline = layout.getOutline(transform);
		clipShape.append(outline, false);

		layout = new TextLayout("World", f, context);
		transform = AffineTransform.getTranslateInstance(0, 144);
		outline = layout.getOutline(transform);
		clipShape.append(outline, false);

		g2.draw(clipShape);
		g2.clip(clipShape);

		final int NLINES = 50;
		Point2D p = new Point2D.Double(0, 0);
		for (int i = 0; i < NLINES; i++) {
			double x = (2 * getWidth() * i) / NLINES;
			double y = (2 * getHeight() * (NLINES - 1 - i)) / NLINES;
			Point2D q = new Point2D.Double(x, y);
			g2.draw(new Line2D.Double(p, q));
		}
	}
}
